package org.posupe.cursos;



public class RepositorioCursosArray implements RepositorioCursos {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Curso[] cursos;
	private int indice;
	public RepositorioCursosArray(int tamanho){
		this.cursos = new Curso[tamanho];
		this.indice = 0;
	}
		
	public void inserir(Curso curso){
		cursos[indice] = curso;
		indice++;
		
		if (this.cursos.length == this.indice) {
			Curso[] novoArray = new Curso[this.cursos.length*2];
			for (int i = 0; i < this.cursos.length; i++) {
				novoArray[i] = this.cursos[i];				
			}
			this.cursos = novoArray;
		}
	}
	public void atualizar(Curso curso) throws CursoInexistenteException{
		int indiceCurso = this.getIndice(curso.getCodigo());
		cursos[indiceCurso] = curso;
		
	}
	public void remover(int codigo) throws CursoInexistenteException{
		int indiceRemover = this.getIndice(codigo);
		while(indiceRemover+1<indice){
			cursos[indiceRemover] = cursos[indiceRemover+1];
			indiceRemover++;
		}
		indice--;
	}
	public Curso procurar(int codigo) throws CursoInexistenteException{
		int indiceAtual = 0;
		boolean achou = false;
		Curso cursoResposta = null;
		while((!achou)&&(indiceAtual<indice)){
			if (cursos[indiceAtual].getCodigo() == codigo){
				cursoResposta= cursos[indiceAtual] ;
				achou = true;
			}
			indiceAtual++;
			
		}
		if (cursoResposta == null){
			throw new CursoInexistenteException(codigo);
		}
		return cursoResposta;
	}
	
	public boolean existe(int codigo){
		int indiceAtual = 0;
		boolean achou = false;
		while((!achou)&&(indiceAtual<indice)){
			if (cursos[indiceAtual].getCodigo() ==codigo){
				achou = true;
			}
			indiceAtual++;
		}
		return achou;
	}
	
	public IteratorCursos procurar(Curso curso) {
		int indiceBusca = 0;
		IteratorCursosVector resultado = new IteratorCursosVector();

		while(indiceBusca<indice){
			if (cursos[indiceBusca].match(curso)){
				resultado.add(cursos[indiceBusca]);
			}
			indiceBusca++;
		}
		
		return resultado;
		
		
	}
	
	public IteratorCursos getIterator() {
		IteratorCursosVector resultado = new IteratorCursosVector();

		for (int i = 0; i < this.indice; i++) {
			resultado.add(this.cursos[i]);
		}

		return resultado;
	}
	
	private int getIndice(int codigo) throws CursoInexistenteException{
		int indiceAtual = -1;
		boolean achou = false;
		while((!achou)&&(indiceAtual<indice)){
			indiceAtual++;
			if (cursos[indiceAtual].getCodigo()==codigo){
				achou = true;
			}
		}
		if (!achou){
			throw new CursoInexistenteException(codigo);
		}
		return indiceAtual;
	}
}
